home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / util / misc / ReportPlus.lha / reportplus / source / f1.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-06-25  |  64.9 KB  |  2,067 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <proto/exec.h>
  4. #include <intuition/intuition.h>
  5. #include <intuition/gadgetclass.h>
  6. #include <proto/intuition.h>
  7. #include <libraries/gadtools.h>
  8. #include <proto/gadtools.h>
  9. #include <dos/dos.h>
  10. #include <proto/dos.h>
  11. #include <graphics/gfx.h>
  12. #include <clib/graphics_protos.h>
  13.  
  14. #include <clib/alib_protos.h>
  15. #include <ctype.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include "rp.h"
  19.  
  20. IMPORT ULONG               elements, // for ReAction texteditor.gadget
  21.                            offset;
  22. IMPORT TEXT                aslresult[MEDFIELD + 1];
  23. IMPORT TEXT                weekdaystring[10],
  24.                            datestring[10],
  25.                            timestring[9];
  26. IMPORT struct SharedStruct shared;
  27. IMPORT struct NewGadget    Gadget;
  28. IMPORT struct Gadget      *BU99_Right,
  29.                           *BU99_TextEditor,
  30.                           *GListPtr,
  31.                           *PrevGadPtr;
  32. IMPORT TEXT                IOBuffer[LONGESTFIELD + 1];
  33. IMPORT SBYTE               page;
  34. IMPORT ABOOL               certified, fillwindows, react;
  35.  
  36. /* report.textfield[] are:
  37.    0: brief bug description
  38.    1: bug generation procedure or example
  39.    2: if this works differently on other versions or hardware, explain
  40.    3: what developer is doing in that area of HW or SW
  41.    4: related problems
  42.    5: enhancement request */
  43.  
  44. #define SUBSYSTEMS 127
  45.  
  46. IMPORT TEXT                string[VLONGFIELD + 1];
  47. MODULE struct List*        SubsystemListPtr = NULL;
  48. MODULE struct
  49. {   STRPTR friendly;
  50.     STRPTR unfriendly;
  51. } subsystems[SUBSYSTEMS + 1] =
  52. {   {"3D Look",                "new.look"        },
  53.     {"A590",                   "A2091.A590"      },
  54.     {"A2013",                  "A2013"           },
  55.     {"A2065",                  "A2065"           },
  56.     {"A2090",                  "A2090.A2090A"    },
  57.     {"A2090A",                 "A2090.A2090A"    },
  58.     {"A2091",                  "A2091"           },
  59.     {"A2232",                  "A2232"           },
  60.     {"A2300",                  "A2300"           },
  61.     {"A2410",                  "A2410"           },
  62.     {"A2620",                  "A2620"           },
  63.     {"A2630",                  "A2630"           },
  64.     {"A3000",                  "A3000"           },
  65.     {"A4091",                  "A4091"           },
  66.     {"AmigaBASIC",             "AmigaBasic"      },
  67.     {"AGA chipset",            "aa.chips"        },
  68.     {"ALink",                  "alink"           },
  69.     {"amiga.lib",              "amiga.lib"       },
  70.     {"AmigaGuide",             "amigaguide"      },
  71.     {"AmigaTerm",              "amigaterm"       },
  72.     {"AmigaVision",            "amigavision"     },
  73.     {"AppShell",               "appshell"        },
  74.     {"ARexx",                  "arexx"           },
  75.     {"Art",                    "art"             },
  76.     {"AS225",                  "as225"           },
  77.     {"ASL.library",            "asl.library"     },
  78.     {"audio.device",           "audio.device"    },
  79.     {"AUTOCONFIG",             "autoconfig"      },
  80.     {"Battery-backed clock",   "battclock"       },
  81.     {"Battery-backed memory",  "battmem"         },
  82.     {"Bootstrap",              "strap"           },
  83.     {"BridgeBoard",            "bridgeboard"     },
  84.     {"BRU",                    "bru"             },
  85.     {"bullet.library",         "bullet"          },
  86.     {"C: programs",            "cdos.command"    },
  87.     {"CD.device",              "cd.device"       },
  88.     {"CD32 hardware",          "cdgs"            },
  89.     {"CDFileSystem",           "cdfilesystem"    },
  90.     {"CDTV",                   "cdtv"            },
  91.     {"CDTV.device",            "cdtv.device"     },
  92.     {"cdui",                   "cdui"            },
  93.     {"CIA.resource",           "cia.resource"    },
  94.     {"CLI",                    "shell"           },
  95.     {"clipboard.device",       "clipboard"       },
  96.     {"Commodities",            "commodities"     },
  97.     {"CON-Handler",            "con-handler"     },
  98.     {"console.device",         "console.device"  },
  99.     {"Custom chipset",         "custom.chips"    },
  100.     {"Datatypes",              "datatypes"       },
  101.     {"debug.lib",              "debug.lib"       },
  102.     {"Developer support",      "devsupport"      },
  103.     {"disk.resource",          "disk.resource"   },
  104.     {"diskfont.library",       "diskfont"        },
  105.     {"DOS.library",            "dos.library"     },
  106.     {"Early Startup Control",  "bootmenu"        },
  107.     {"Envoy",                  "envoy"           },
  108.     {"Exec.library",           "exec"            },
  109.     {"expansion.library",      "expansion"       },
  110.     {"filesystem",             "filesystem"      },
  111.     {"filesystem.resource",    "filesysres"      },
  112.     {"Fonts",                  "fonts"           },
  113.     {"Fountain",               "fountain"        },
  114.     {"gadget.classes",         "gadget.classes"  },
  115.     {"GadTools.library",       "gadtools"        },
  116.     {"gameport.device",        "gameport"        },
  117.     {"Genlock",                "genlock"         },
  118.     {"Graphics",               "graphics"        },
  119.     {"Hardware",               "hardware"        },
  120.     {"HDBackup",               "hdbackup"        },
  121.     {"HDToolBox",              "hdtoolbox"       },
  122.     {"icon.library",           "icon.library"    },
  123.     {"IconEdit",               "iconedit"        },
  124.     {"IDE.device",             "ide.device"      },
  125.     {"IFFParse.library",       "iffparse"        },
  126.     {"input.device",           "input.device"    },
  127.     {"Installer",              "installer"       },
  128.     {"IntelliFont",            "fountain"        },
  129.     {"Intuition.library",      "intuition"       },
  130.     {"IPrefs",                 "iprefs"          },
  131.     {"Keyboard",               "keyboard"        },
  132.     {"keymap.library",         "keymap"          },
  133.     {"Keymaps",                "keymaps"         },
  134.     {"layers.library",         "layers"          },
  135.     {"locale.library",         "locale.library"  },
  136.     {"lowlevel.library",       "lowlevel"        },
  137.     {"Maths: FFP",             "mathffp"         },
  138.     {"Maths: IEEE Dbl Prcsn",  "mathieeedoub"    },
  139.     {"Maths: IEEE Sngl Prcsn", "mathieeesing"    },
  140.     {"Maths: IEEE",            "mathieee"        },
  141.     {"MicroEMACS",             "microemacs"      },
  142.     {"Monitors",               "monitors"        },
  143.     {"MultiView",              "multiview"       },
  144.     {"nonvolatile",            "nonvolatile"     },
  145.     {"parallel.device",        "parallel.device" },
  146.     {"PCMCIA",                 "creditcard"      },
  147.     {"PORT-Handler",           "port-handler"    },
  148.     {"potgo.resource",         "potgo.resource"  },
  149.     {"Preferences",            "preferences"     },
  150.     {"Printer drivers",        "printer.driver"  },
  151.     {"printer.device",         "printer.device"  },
  152.     {"QUEUE-Handler",          "queue-handler"   },
  153.     {"RAM-Handler",            "ram-handler"     },
  154.     {"ramlib",                 "ramlib"          },
  155.     {"realtime",               "realtime"        },
  156.     {"Report+",                "report+"         },
  157.     {"Resources",              "resource"        },
  158.     {"ROM Kernel Manuals",     "rkm"             },
  159.     {"ROMWack",                "wack"            },
  160.     {"SANA-2",                 "sana2"           },
  161.     {"Scripts",                "script"          },
  162.     {"SCSI.device",            "scsi.device"     },
  163.     {"serial.device",          "serial.device"   },
  164.     {"Shell",                  "shell"           },
  165.     {"Startup",                "startup"         },
  166.     {"System/ programs",       "system.command"  },
  167.     {"TCP/IP",                 "as225"           },
  168.     {"timer.device",           "timer.device"    },
  169.     {"ToolMaker",              "toolmaker"       },
  170.     {"Tools/ programs",        "tools"           },
  171.     {"trackdisk.device",       "trackdisk"       },
  172.     {"UNIX",                   "unix"            },
  173.     {"Unsure",                 ""                },
  174.     {"User manuals",           "userdocs"        },
  175.     {"Utilities/ programs",    "util.command"    },
  176.     {"utility.library",        "utility.library" },
  177.     {"Wack",                   "wack"            },
  178.     {"Workbench",              "workbench"       },
  179.     {"Worm Wars",              "wormwars"        }
  180. };
  181.  
  182. MODULE void refreshpv(void);
  183. MODULE void updatereportgadgets(void);
  184. MODULE void readreportgadgets(void);
  185.  
  186. AGLOBAL struct ReportStruct report;
  187.  
  188. MODULE STRPTR TypeOptions[4] =
  189. {   "System Software/Hardware Bug",
  190.     "3rd Party Product Compatibility",
  191.     "Enhancement Request",
  192.     NULL
  193. };
  194. MODULE STRPTR SeverityOptions[5] =
  195. {   (STRPTR) "Crashes, hangs or corrupts data",
  196.     (STRPTR) "Behaves incorrectly",
  197.     (STRPTR) "Cosmetic problem",
  198.     (STRPTR) "Works correctly",
  199.     NULL
  200. };
  201. MODULE STRPTR AgnusOptions[6] =
  202. {   (STRPTR) "AGA",
  203.     (STRPTR) "ECS PAL",
  204.     (STRPTR) "ECS NTSC",
  205.     (STRPTR) "OCS PAL",
  206.     (STRPTR) "OCS NTSC",
  207.     NULL
  208. };
  209. MODULE STRPTR DeniseOptions[4] =
  210. {   (STRPTR) "AGA",
  211.     (STRPTR) "ECS",
  212.     (STRPTR) "OCS",
  213.     NULL
  214. };
  215. #define CPUS 6
  216. MODULE STRPTR CPUOptions[CPUS + 2] =
  217. {   (STRPTR) "68000",
  218.     (STRPTR) "68010",
  219.     (STRPTR) "68020",
  220.     (STRPTR) "68030",
  221.     (STRPTR) "68040",
  222.     (STRPTR) "68060",
  223.     (STRPTR) "PowerPC",
  224.     NULL
  225. };
  226. #define MODELS 13
  227. MODULE STRPTR ModelOptions[MODELS + 2] =
  228. {   (STRPTR) "A500",
  229.     (STRPTR) "A500+",
  230.     (STRPTR) "A600",
  231.     (STRPTR) "A1000",
  232.     (STRPTR) "A1200",
  233.     (STRPTR) "A1500",
  234.     (STRPTR) "A2000",
  235.     (STRPTR) "A2500",
  236.     (STRPTR) "A3000",
  237.     (STRPTR) "A4000",
  238.     (STRPTR) "CDTV",
  239.     (STRPTR) "CD32",
  240.     (STRPTR) "DraCo",
  241.     (STRPTR) "Emulator",
  242.     NULL
  243. };
  244. IMPORT struct Window*  MainWindowPtr;
  245. MODULE struct Gadget  *CY11_Type               = NULL,
  246.                       *ST11_Summary            = NULL,
  247.                       *BU11_PathnameASL        = NULL,
  248.                       *LV11_Subsystem          = NULL,
  249.                       *CY11_Severity           = NULL,
  250.                       *ST11_Debug              = NULL,
  251.                       *ST11_KS                 = NULL,
  252.                       *ST11_WB                 = NULL,
  253.                       *ST11_Pathname           = NULL,
  254.                       *ST11_Version            = NULL,
  255.                       *TE11_3rdLabel           = NULL,
  256.                       *ST11_3rdName            = NULL,
  257.                       *ST11_3rdVer             = NULL,
  258.                       *ST11_3rdManuf           = NULL,
  259.                       *BU11_Sender             = NULL,
  260.                       *BU11_Config             = NULL,
  261.                       *TE11_EMailTo            = NULL,
  262.                       *ST12_Company            = NULL,
  263.                       *ST12_Developer          = NULL,
  264.                       *ST12_EMail              = NULL,
  265.                       *ST12_FirstName          = NULL,
  266.                       *ST12_LastName           = NULL,
  267.                       *ST12_Phone              = NULL,
  268.                       *MX13_Model              = NULL,
  269.                       *TE13_ModelText          = NULL,
  270.                       *MX13_Agnus              = NULL,
  271.                       *TE13_AgnusText          = NULL,
  272.                       *MX13_CPU                = NULL,
  273.                       *TE13_CPUText            = NULL,
  274.                       *MX13_Denise             = NULL,
  275.                       *TE13_DeniseText         = NULL,
  276.                       *IN13_Floppies           = NULL,
  277.                       *ST13_Chip               = NULL,
  278.                       *TE13_ChipText           = NULL,
  279.                       *ST13_Fast               = NULL,
  280.                       *TE13_FastText           = NULL,
  281.                       *ST13_Hard               = NULL,
  282.                       *ST13_Expansion          = NULL;
  283.  
  284. AGLOBAL void report1(void)
  285. {  /* PAGE 11 ************************************************************ */
  286.  
  287.     verynewwindow
  288.     (   REPORTWIDTH, REPORTHEIGHT,
  289.         "Report+: Report Details",
  290.         BUTTONIDCMP | LISTVIEWIDCMP | STRINGIDCMP | CYCLEIDCMP
  291.     );
  292.     if (fillwindows)
  293.     {   SetAPen(MainWindowPtr->RPort, 0);
  294.         RectFill(MainWindowPtr->RPort,  10, 144,  10 + 174, 144 + 87 - 4); // LV11_Subsystem
  295.         RectFill(MainWindowPtr->RPort, 182,  32, 182 + 312,  32 + 12);     // TE11_EMailTo
  296.     }
  297.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_NEW,    NOSUB));
  298.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_OPEN,   NOSUB));
  299.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVE,   NOSUB));
  300.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVEAS, NOSUB));
  301.  
  302.     /* summary */
  303.     setgadget(182, 20, 448, 12, "_Summary:", PLACETEXT_LEFT);
  304.     ST11_Summary = PrevGadPtr = (struct Gadget *) CreateGadget
  305.     (   STRING_KIND,
  306.         PrevGadPtr,
  307.         &Gadget,
  308.         STRINGA_Justification, GACT_STRINGLEFT,
  309.         GTST_String, &(report.summary),
  310.         GTST_MaxChars, LONGFIELD,
  311.         GA_TabCycle, TRUE,
  312.         GT_Underscore, '_',
  313.         TAG_DONE
  314.     );
  315.     /* email to */
  316.     setgadget(182, 32, 312, 12, "EMail to:", PLACETEXT_LEFT);
  317.     TE11_EMailTo = PrevGadPtr = (struct Gadget *) CreateGadget
  318.     (   TEXT_KIND,
  319.         PrevGadPtr,
  320.         &Gadget,
  321.         GTTX_Border, TRUE,
  322.         TAG_DONE
  323.     );
  324.  
  325.     /* sender... */
  326.     setgadget(10,  86, 140, 12, "Sende_r...", NULL);
  327.     BU11_Sender = PrevGadPtr = (struct Gadget *) CreateGadget
  328.     (   BUTTON_KIND,
  329.         PrevGadPtr,
  330.         &Gadget,
  331.         GT_Underscore, '_',
  332.         TAG_DONE
  333.     );
  334.     /* configuration... */
  335.     setgadget(10,  98, 140, 12, "Confi_guration...", NULL);
  336.     BU11_Config = PrevGadPtr = (struct Gadget *) CreateGadget
  337.     (   BUTTON_KIND,
  338.         PrevGadPtr,
  339.         &Gadget,
  340.         GT_Underscore, '_',
  341.         TAG_DONE
  342.     );
  343.     /* text editor... */
  344.     setgadget(10, 110, 140, 12, "Te_xt editor...", NULL);
  345.     BU99_TextEditor = PrevGadPtr = (struct Gadget *) CreateGadget
  346.     (   BUTTON_KIND,
  347.         PrevGadPtr,
  348.         &Gadget,
  349.         GT_Underscore, '_',
  350.         TAG_DONE
  351.     );
  352.  
  353.     /* type */
  354.     setgadget(100, 54, 284, 12, "_Type:", PLACETEXT_LEFT);
  355.     CY11_Type = PrevGadPtr = (struct Gadget *) CreateGadget
  356.     (   CYCLE_KIND,
  357.         PrevGadPtr,
  358.         &Gadget,
  359.         GTCY_Labels, TypeOptions,
  360.         GTCY_Active, report.type,
  361.         GT_Underscore, '_',
  362.         TAG_DONE
  363.     );
  364.  
  365.     /* classification */
  366.     setgadget(100, 66, 284, 12, "Sever_ity:", PLACETEXT_LEFT);
  367.     CY11_Severity = PrevGadPtr = (struct Gadget *) CreateGadget
  368.     (   CYCLE_KIND,
  369.         PrevGadPtr,
  370.         &Gadget,
  371.         GTCY_Labels, SeverityOptions,
  372.         GTCY_Active, report.severity,
  373.         GT_Underscore, '_',
  374.         TAG_DONE
  375.     );
  376.  
  377.     setgadget(10, 144, 174, 87, "Subsystem:", NULL);
  378.     LV11_Subsystem = PrevGadPtr = (struct Gadget *) CreateGadget
  379.     (   LISTVIEW_KIND,
  380.         PrevGadPtr,
  381.         &Gadget,
  382.         GTLV_Labels, SubsystemListPtr,
  383.         GTLV_ShowSelected, NULL,
  384.         GTLV_Selected, report.subsystem,
  385.         GT_Underscore, '_',
  386.         TAG_DONE
  387.     );
  388.  
  389.     /* 3rd party product */
  390.     setgadget(422, 190, 100, 1, "3rd Party Product:", PLACETEXT_ABOVE);
  391.     TE11_3rdLabel = PrevGadPtr = (struct Gadget *) CreateGadget
  392.     (   TEXT_KIND,
  393.         PrevGadPtr,
  394.         &Gadget,
  395.         TAG_DONE
  396.     );
  397.     /* 3rd party product name */
  398.     setgadget(400, 190, 200, 12, "N_ame:", NULL);
  399.     ST11_3rdName = PrevGadPtr = (struct Gadget *) CreateGadget
  400.     (   STRING_KIND,
  401.         PrevGadPtr,
  402.         &Gadget,
  403.         GTST_String, &(report.thirdname),
  404.         GTST_MaxChars, MEDFIELD,
  405.         GA_TabCycle, TRUE,
  406.         GT_Underscore, '_',
  407.         TAG_DONE
  408.     );
  409.     /* 3rd party product version */
  410.     setgadget(400, 202, 100, 12, "_Version:", NULL);
  411.     ST11_3rdVer = PrevGadPtr = (struct Gadget *) CreateGadget
  412.     (   STRING_KIND,
  413.         PrevGadPtr,
  414.         &Gadget,
  415.         GTST_String, &(report.thirdver),
  416.         GTST_MaxChars, MEDFIELD,
  417.         GA_TabCycle, TRUE,
  418.         GT_Underscore, '_',
  419.         TAG_DONE
  420.     );
  421.     /* 3rd party product manufacturer */
  422.     setgadget(400, 214, 200, 12, "_Manufacturer:", NULL);
  423.     ST11_3rdManuf = PrevGadPtr = (struct Gadget *) CreateGadget
  424.     (   STRING_KIND,
  425.         PrevGadPtr,
  426.         &Gadget,
  427.         GTST_String, &(report.thirdmanuf),
  428.         GTST_MaxChars, MEDFIELD,
  429.         GA_TabCycle, TRUE,
  430.         GT_Underscore, '_',
  431.         TAG_DONE
  432.     );
  433.  
  434.     /* debug tools and wedges */
  435.     setgadget(400, 78, 196, 12, "_Debug tools and wedges:", PLACETEXT_ABOVE);
  436.     ST11_Debug = PrevGadPtr = (struct Gadget *) CreateGadget
  437.     (   STRING_KIND,
  438.         PrevGadPtr,
  439.         &Gadget,
  440.         STRINGA_Justification, GACT_STRINGLEFT,
  441.         GTST_String, &(report.debug),
  442.         GTST_MaxChars, LONGFIELD,
  443.         GA_TabCycle, TRUE,
  444.         GT_Underscore, '_',
  445.         TAG_DONE
  446.     );
  447.  
  448.     /* kickstart version */
  449.     if (report.ks[0] == 0)
  450.         if (GetVar("Kickstart", report.ks, 6, NULL) == -1)
  451.             report.ks[0] = 0;
  452.     setgadget(400, 102, 60, 12, "_Kickstart version:", NULL);
  453.     ST11_KS = PrevGadPtr = (struct Gadget *) CreateGadget
  454.     (   STRING_KIND,
  455.         PrevGadPtr,
  456.         &Gadget,
  457.         GTST_String, &(report.ks),
  458.         GTST_MaxChars, 6,
  459.         GA_TabCycle, TRUE,
  460.         GT_Underscore, '_',
  461.         STRINGA_Justification, GACT_STRINGRIGHT,
  462.         TAG_DONE
  463.     );
  464.     /* workbench version */
  465.     if (report.wb[0] == 0)
  466.         if (GetVar("Workbench", report.wb, 6, NULL) == -1)
  467.             report.wb[0] = 0;
  468.     setgadget(400, 114, 60, 12, "_Workbench version:", NULL);
  469.     ST11_WB = PrevGadPtr = (struct Gadget *) CreateGadget
  470.     (   STRING_KIND,
  471.         PrevGadPtr,
  472.         &Gadget,
  473.         GTST_String, &(report.wb),
  474.         GTST_MaxChars, 6,
  475.         GA_TabCycle, TRUE,
  476.         GT_Underscore, '_',
  477.         STRINGA_Justification, GACT_STRINGRIGHT,
  478.         TAG_DONE
  479.     );
  480.  
  481.     /* program pathname */
  482.     setgadget(400, 138, 196, 12, "P_rogram pathname:", NULL);
  483.     ST11_Pathname = PrevGadPtr = (struct Gadget *) CreateGadget
  484.     (   STRING_KIND,
  485.         PrevGadPtr,
  486.         &Gadget,
  487.         GTST_String, &(report.pp),
  488.         GTST_MaxChars, LONGFIELD,
  489.         GA_TabCycle, TRUE,
  490.         GT_Underscore, '_',
  491.         TAG_DONE
  492.     );
  493.     /* program... */
  494.     setgadget(598, 138, 28, 12, "...", NULL);
  495.     BU11_PathnameASL = PrevGadPtr = (struct Gadget *) CreateGadget
  496.     (   BUTTON_KIND,
  497.         PrevGadPtr,
  498.         &Gadget,
  499.         GT_Underscore, '_',
  500.         TAG_DONE
  501.     );
  502.     /* program version */
  503.     setgadget(400, 150, 196, 12, "Program v_ersion:", NULL);
  504.     ST11_Version = PrevGadPtr = (struct Gadget *) CreateGadget
  505.     (   STRING_KIND,
  506.         PrevGadPtr,
  507.         &Gadget,
  508.         GTST_String, &(report.pv),
  509.         GTST_MaxChars, LONGFIELD,
  510.         GA_TabCycle, TRUE,
  511.         GT_Underscore, '_',
  512.         TAG_DONE
  513.     );
  514.  
  515.     drawgadgets((UWORD) ~0);
  516.  
  517.     updatereportgadgets(); // we do need this here, so that gadgets are
  518.                            // ghosted as appropriate
  519.     ActivateGadget(ST11_Summary, MainWindowPtr, NULL);
  520.  
  521.     loop();
  522.     readreportgadgets();
  523.     closewindow();
  524. }
  525.  
  526. MODULE void readreportgadgets(void)
  527. {   strcpy
  528.     (   report.summary,
  529.         ((struct StringInfo *) ST11_Summary->SpecialInfo)->Buffer
  530.     );
  531.     if (report.type == COM)
  532.     {   strcpy
  533.         (   report.thirdver,
  534.             ((struct StringInfo *) ST11_3rdVer->SpecialInfo)->Buffer
  535.         );
  536.         strcpy
  537.         (   report.thirdname,
  538.             ((struct StringInfo *) ST11_3rdName->SpecialInfo)->Buffer
  539.         );
  540.         strcpy
  541.         (   report.thirdmanuf,
  542.             ((struct StringInfo *) ST11_3rdManuf->SpecialInfo)->Buffer
  543.         );
  544.     } elif (report.type == BUG)
  545.     {   strcpy
  546.         (   report.pp,
  547.             ((struct StringInfo *) ST11_Pathname->SpecialInfo)->Buffer
  548.         );
  549.         strcpy
  550.         (   report.pv,
  551.             ((struct StringInfo *) ST11_Version->SpecialInfo)->Buffer
  552.         );
  553.     }
  554.     if (report.type != ENH)
  555.     {   strcpy
  556.         (   report.ks,
  557.             ((struct StringInfo *) ST11_KS->SpecialInfo)->Buffer
  558.         );
  559.         strcpy
  560.         (   report.wb,
  561.             ((struct StringInfo *) ST11_WB->SpecialInfo)->Buffer
  562.         );
  563.         strcpy
  564.         (   report.debug,
  565.             ((struct StringInfo *) ST11_Debug->SpecialInfo)->Buffer
  566.         );
  567. }   }
  568.  
  569. AGLOBAL void savereport(ABOOL saveas)
  570. { /*    # Subject: <subject><LF>
  571.         # Type: bug|compat|enhancement<LF>
  572. 1,3     # Subsystem: <subsystem><LF>
  573. 2       # ProductName: <name> (vers=<version>)
  574. 2       # ProductInfo: :<manufacturer>:
  575.         # Severity: a|b|c|ok|e
  576. 1       # Release: KS=<version>,WB=<version>,Program=<version>
  577. 2       # Release: KS=<version>,WB=<version>
  578.         # Date: <weekday> dd-Mon-yy hh:mm:ss
  579.         # Refer: <refer>
  580.         # Path: <path>
  581.         # ReferID: <referid>
  582.         # Config: <config>
  583. 1,2a-c    ### BRIEF BUG DESCRIPTION:
  584. 1,2a-c    ### BUG GENERATION PROCEDURE OR EXAMPLE:
  585. 1,2     ### ALSO RUNNING:
  586.         <debug>
  587. 1,2     ### IF THIS WORKS DIFFERENTLY ON OTHER VERSIONS OR HARDWARE,
  588.         EXPLAIN:
  589. 2a-c    ### WHAT DEVELOPER IS DOING IN THAT AREA OF SW OR HW:    
  590. 1,2a-c    ### RELATED PROBLEMS:
  591. 3       ### ENHANCEMENT REQUEST: */
  592.  
  593.     readreportgadgets();
  594.  
  595.     strcpy(IOBuffer, "# Subject: ");
  596.     strcat(IOBuffer, report.summary);
  597.     strcat(IOBuffer, "\n# Type: ");
  598.     if (report.type == BUG)
  599.     strcat(IOBuffer, "bug");
  600.     elif (report.type == COM)
  601.         strcat(IOBuffer, "compat");
  602.     else /* assumes (report.type == ENH) */
  603.         strcat(IOBuffer, "enhancement");
  604.     strcat(IOBuffer, "\n");
  605.     if (report.type == BUG || report.type == ENH)
  606.     {    strcat(IOBuffer, "# Subsystem: ");
  607.         strcat(IOBuffer, subsystems[report.subsystem].unfriendly);
  608.     strcat(IOBuffer, "\n");
  609.     } else
  610.     {    strcat(IOBuffer, "# ProductName: ");
  611.     strcat(IOBuffer, report.thirdname);
  612.         strcat(IOBuffer, " (vers=");
  613.         strcat(IOBuffer, report.thirdver);
  614.         strcat(IOBuffer, ")\n# ProductInfo: :");
  615.         strcat(IOBuffer, report.thirdmanuf);
  616.         strcat(IOBuffer, ":\n");
  617.     }
  618.     strcat(IOBuffer, "# Severity: ");
  619.     if (report.type == ENH)
  620.         strcat(IOBuffer, "e");
  621.     elif (report.severity == 0)
  622.         strcat(IOBuffer, "a");
  623.     elif (report.severity == 1)
  624.         strcat(IOBuffer, "b");
  625.     elif (report.severity == 2)
  626.         strcat(IOBuffer, "c");
  627.     else /* assumes report.severity == 3 */
  628.     strcat(IOBuffer, "ok");
  629.     strcat(IOBuffer, "\n");
  630.     if (report.type == BUG || report.type == COM)
  631.     {    strcat(IOBuffer, "# Release: KS=");
  632.         strcat(IOBuffer, report.ks);
  633.         strcat(IOBuffer, ",WB=");
  634.         strcat(IOBuffer, report.wb);
  635.         if (report.type == BUG)
  636.         {    strcat(IOBuffer, ",Program=");
  637.             strcat(IOBuffer, report.pv);
  638.         }
  639.         strcat(IOBuffer, "\n");
  640.     }
  641.     
  642.     getdate();
  643.     strcat(IOBuffer, "# Date: ");
  644.     strcat(IOBuffer, weekdaystring);
  645.     strcat(IOBuffer, " ");
  646.     strcat(IOBuffer, datestring);
  647.     strcat(IOBuffer, " ");
  648.     strcat(IOBuffer, timestring);
  649.     strcat(IOBuffer, "\n");
  650.     strcat(IOBuffer, report.refer);
  651.     strcat(IOBuffer, report.path);
  652.     strcat(IOBuffer, report.referid);
  653.     strcat(IOBuffer, report.config);
  654.     strcat(IOBuffer, "\n");
  655.  
  656.     if (report.type == BUG || (report.type == COM && report.severity != 3))
  657.     {   strcat
  658.         (   IOBuffer,
  659.             "### BRIEF BUG DESCRIPTION:\n"
  660.         );
  661.         strcat(IOBuffer, report.textfield[0]);
  662.         strcat
  663.         (   IOBuffer,
  664.             "\n\n### BUG GENERATION PROCEDURE OR EXAMPLE:\n"
  665.     );
  666.         strcat(IOBuffer, report.textfield[1]);
  667.         strcat(IOBuffer, "\n\n");
  668.     }
  669.     if (report.type == BUG || report.type == COM)
  670.     {   strcat(IOBuffer, "### ALSO RUNNING:\n");
  671.         strcat(IOBuffer, report.debug);
  672.         strcat
  673.         (   IOBuffer,
  674.             "\n\n### IF THIS WORKS DIFFERENTLY ON "
  675.             "OTHER VERSIONS OR HARDWARE, EXPLAIN:\n"
  676.         );
  677.         strcat(IOBuffer, report.textfield[2]);
  678.         strcat(IOBuffer, "\n\n");
  679.     }
  680.     if (report.type == COM && report.severity != 3)
  681.     {   strcat
  682.         (   IOBuffer,
  683.             "### WHAT DEVELOPER IS DOING IN THAT AREA OF HW OR SW:\n"
  684.         );
  685.         strcat(IOBuffer, report.textfield[3]);
  686.         strcat(IOBuffer, "\n\n");
  687.     }
  688.     if (report.type == BUG || (report.type == COM && report.severity != 3))
  689.     {   strcat(IOBuffer, "### RELATED PROBLEMS:\n");
  690.         strcat(IOBuffer, report.textfield[4]);
  691.         strcat(IOBuffer, "\n\n");
  692.     } elif (report.type == ENH)
  693.     {   strcat(IOBuffer, "### ENHANCEMENT REQUEST:\n");
  694.         strcat(IOBuffer, report.textfield[5]);
  695.         strcat(IOBuffer, "\n\n");
  696.     }
  697.  
  698.     if (!report.output[0] || saveas) // if we need a filename
  699.     {   if (saveasl("Save Bug Report"))
  700.         {   strcpy(report.output, aslresult);
  701.             writeout(report.output);
  702. }   }   }
  703.     
  704. AGLOBAL void report_loop(ULONG class, struct Gadget* addr, UWORD code, UWORD qual)
  705. {   if (page == 11)
  706.     {   if (class == IDCMP_RAWKEY && report.type != COM)
  707.         {   if (qual & IEQUALIFIER_CONTROL)
  708.             {   if (code == SCAN_UP)
  709.                 {   GT_SetGadgetAttrs
  710.                     (   LV11_Subsystem,
  711.                         MainWindowPtr,
  712.                         NULL,
  713.                         GTLV_Top, 0,
  714.                         TAG_DONE
  715.                     );
  716.                 } elif (code == SCAN_DOWN)
  717.                 {   GT_SetGadgetAttrs
  718.                     (   LV11_Subsystem,
  719.                         MainWindowPtr,
  720.                         NULL,
  721.                         GTLV_Top, SUBSYSTEMS - 10 + 1,
  722.                         // this must change according to height of listview
  723.                         TAG_DONE
  724.                     );
  725.         }   }   }
  726.         elif (class == IDCMP_VANILLAKEY)
  727.         {   code = toupper(code);
  728.             if (code == ESCAPE)
  729.             {   page = 0;
  730.             } elif (code == 'N')
  731.             {   page = 12;
  732.             } elif (code == 'T')
  733.             {   if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT))
  734.                 {   if (report.type == 0)
  735.                     {   report.type = 2;
  736.                     } else report.type--;
  737.                 } else
  738.                 {   if (report.type == 2)
  739.                     {   report.type = 0;
  740.                     } else report.type++;
  741.                 }
  742.                 updatereportgadgets();
  743.             } elif (code == 'S')
  744.             {   ActivateGadget(ST11_Summary, MainWindowPtr, NULL);
  745.             } elif (code == 'X')
  746.             {   if (!react)
  747.                 {   savereport(FALSE);
  748.                 }
  749.                 launcheditor(report.output);
  750.             } elif (code == 'R')
  751.             {   page = 12;
  752.             } elif (code == 'G')
  753.             {   page = 13;
  754.             } elif (report.type != ENH)
  755.             {   if (code == 'K')
  756.                 {   ActivateGadget(ST11_KS, MainWindowPtr, NULL);
  757.                 } elif (code == 'W')
  758.                 {   ActivateGadget(ST11_WB, MainWindowPtr, NULL);
  759.                 } elif (code == 'D')
  760.                 {   ActivateGadget(ST11_Debug, MainWindowPtr, NULL);
  761.                 } elif (code == 'I')
  762.                 {   if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT))
  763.                     {   if (report.severity == 0)
  764.                         {   report.severity = 3;
  765.                         } else report.severity--;
  766.                     } else
  767.                     {   if (report.severity == 3)
  768.                         {   report.severity = 0;
  769.                         } else report.severity++;
  770.                     }
  771.                     if (report.type == BUG && report.severity == 3)
  772.                     {   report.severity = 0;
  773.                     }
  774.                     GT_SetGadgetAttrs
  775.                     (   CY11_Severity,
  776.                         MainWindowPtr,
  777.                         NULL,
  778.                         GTCY_Active, report.severity,
  779.                         TAG_DONE
  780.                     );
  781.                 } elif (report.type == BUG)
  782.                 {   if (code == 'P')
  783.                     {   ActivateGadget(ST11_Pathname, MainWindowPtr, NULL);
  784.                     } elif (code == 'E')
  785.                     {   ActivateGadget(ST11_Version, MainWindowPtr, NULL);
  786.                 }   }
  787.                 else
  788.                 {   // assert(report.type == COM);
  789.                     if (code == 'A')
  790.                     {   ActivateGadget(ST11_3rdName, MainWindowPtr, NULL);
  791.                     } elif (code == 'V')
  792.                     {   ActivateGadget(ST11_3rdVer, MainWindowPtr, NULL);
  793.                     } elif (code == 'M')
  794.                     {   ActivateGadget(ST11_3rdManuf, MainWindowPtr, NULL);
  795.         }   }   }   }
  796.         elif (class == IDCMP_GADGETUP)
  797.         {   if (addr == BU99_Right)
  798.             {   page = 0;
  799.             } elif (addr == BU11_Sender)
  800.             {   page = 12;
  801.             } elif (addr == BU11_Config)
  802.             {   page = 13;
  803.             } elif (addr == BU99_TextEditor)
  804.             {   if (!react)
  805.                 {   savereport(FALSE);
  806.                 }
  807.                 launcheditor(report.output);
  808.             }
  809.             elif (addr == CY11_Type)
  810.             {   report.type = code;
  811.                 updatereportgadgets();
  812.             } elif (report.type != COM && addr == LV11_Subsystem)
  813.             {   // code is the position within the list.
  814.                 report.subsystem = code;
  815.             } elif (report.type != ENH)
  816.             {   if (addr == CY11_Severity)
  817.                 {   report.severity = code;
  818.                     if (report.type == BUG && report.severity == 3)
  819.                     {   report.severity = 0;
  820.                         GT_SetGadgetAttrs
  821.                         (   CY11_Severity,
  822.                             MainWindowPtr,
  823.                             NULL,
  824.                             GTCY_Active, report.severity,
  825.                             TAG_DONE
  826.                         );
  827.                 }   }
  828.                 elif (report.type == BUG)
  829.                 {   if (addr == ST11_Pathname)
  830.                     {   refreshpv();
  831.                     } elif (addr == BU11_PathnameASL)
  832.                     {   if (asl())
  833.                         {   GT_SetGadgetAttrs
  834.                             (   ST11_Pathname,
  835.                                 MainWindowPtr,
  836.                                 NULL,
  837.                                 GTST_String, aslresult,
  838.                                 TAG_DONE
  839.                             );
  840.                             refreshpv();
  841.     }   }   }   }   }   }
  842.     elif (page == 12)
  843.     {   if (class == IDCMP_GADGETUP)
  844.         {   if (addr == BU99_Right)
  845.             {   if (certified)
  846.                     page = 33;
  847.                 else page = 11;
  848.         }   }
  849.         elif (class == IDCMP_VANILLAKEY)
  850.         {   code = toupper(code);
  851.             if (code == ESCAPE)
  852.             {   if (certified)
  853.                     page = 33;
  854.                 else page = 11;
  855.             } elif (code == 'F')
  856.             {   ActivateGadget(ST12_FirstName, MainWindowPtr, NULL);
  857.             } elif (code == 'L')
  858.             {   ActivateGadget(ST12_LastName,  MainWindowPtr, NULL);
  859.             } elif (code == 'C')
  860.             {   ActivateGadget(ST12_Company,   MainWindowPtr, NULL);
  861.             } elif (code == 'D')
  862.             {   ActivateGadget(ST12_Developer, MainWindowPtr, NULL);
  863.             } elif (code == 'P')
  864.             {   ActivateGadget(ST12_Phone,     MainWindowPtr, NULL);
  865.             } elif (code == 'E')
  866.             {   ActivateGadget(ST12_EMail,     MainWindowPtr, NULL);
  867.     }   }   }
  868.     elif (page == 13)
  869.     {   if (class == IDCMP_VANILLAKEY)
  870.         {   code = toupper(code);
  871.             if (code == ESCAPE)
  872.             {   page = 11;
  873.             } elif (code == 'A')
  874.             {   if ((code & IEQUALIFIER_LSHIFT) || (code & IEQUALIFIER_RSHIFT))
  875.                 {   if (report.agnus == 0)
  876.                         report.agnus = 5;
  877.                     else report.agnus--;
  878.                 } else
  879.                 {   if (report.agnus == 5)
  880.                         report.agnus = 0;
  881.                     else report.agnus++;
  882.                 }
  883.                 if (report.agnus == 0)
  884.                     report.denise = 0;
  885.                 elif (report.agnus == 1 || report.agnus == 2)
  886.                     report.denise = 1;
  887.                 else
  888.                 {   /* assert(report.agnus == 3 || report.agnus == 4); */
  889.                     report.denise = 2;
  890.                 }
  891.                 GT_SetGadgetAttrs
  892.                 (   MX13_Agnus,
  893.                     MainWindowPtr,
  894.                     NULL,
  895.                     GTMX_Active, report.agnus,
  896.                     TAG_DONE
  897.                 );
  898.                 GT_SetGadgetAttrs
  899.                 (   MX13_Denise,
  900.                     MainWindowPtr,
  901.                     NULL,
  902.                     GTMX_Active, report.denise,
  903.                     TAG_DONE
  904.                 );
  905.             } elif (code == 'C')
  906.             {   ActivateGadget(ST13_Chip, MainWindowPtr, NULL);
  907.             } elif (code == 'E')
  908.             {   ActivateGadget(ST13_Expansion, MainWindowPtr, NULL);
  909.             } elif (code == 'H')
  910.             {   ActivateGadget(ST13_Hard, MainWindowPtr, NULL);
  911.             } elif (code == 'L')
  912.             {   if ((code & IEQUALIFIER_LSHIFT) || (code & IEQUALIFIER_RSHIFT))
  913.                 {   if (report.denise == 0)
  914.                         report.denise = 3;
  915.                     else report.denise--;
  916.                 } else
  917.                 {   if (report.denise == 3)
  918.                         report.denise = 0;
  919.                     else report.denise++;
  920.                 }
  921.                 GT_SetGadgetAttrs
  922.                 (   MX13_Denise,
  923.                     MainWindowPtr,
  924.                     NULL,
  925.                     GTMX_Active, report.denise,
  926.                     TAG_DONE
  927.                 );
  928.             } elif (code == 'M')
  929.             {   if ((code & IEQUALIFIER_LSHIFT) || (code & IEQUALIFIER_RSHIFT))
  930.                 {   if (report.model == 0)
  931.                         report.model = MODELS;
  932.                     else report.model--;
  933.                 } else
  934.                 {   if (report.model == CPUS)
  935.                         report.model = 0;
  936.                     else report.model++;
  937.                 }
  938.                 GT_SetGadgetAttrs
  939.                 (   MX13_Model,
  940.                     MainWindowPtr,
  941.                     NULL,
  942.                     GTMX_Active, report.model,
  943.                     TAG_DONE
  944.                 );
  945.             } elif (code == 'N')
  946.             {   ActivateGadget(IN13_Floppies, MainWindowPtr, NULL);
  947.             } elif (code == 'P')
  948.             {   if ((code & IEQUALIFIER_LSHIFT) || (code & IEQUALIFIER_RSHIFT))
  949.                 {   if (report.cpu == 0)
  950.                         report.cpu = CPUS;
  951.                     else report.cpu--;
  952.                 } else
  953.                 {   if (report.cpu == CPUS)
  954.                         report.cpu = 0;
  955.                     else report.cpu++;
  956.                 }
  957.                 GT_SetGadgetAttrs
  958.                 (   MX13_CPU,
  959.                     MainWindowPtr,
  960.                     NULL,
  961.                     GTMX_Active, report.cpu,
  962.                     TAG_DONE
  963.                 );
  964.             } elif (code == 'S')
  965.             {   ActivateGadget(ST13_Fast, MainWindowPtr, NULL);
  966.         }   }
  967.         elif (class == IDCMP_GADGETUP)
  968.         {   if (addr == BU99_Right)
  969.                 page = 11;
  970.             elif (addr == IN13_Floppies)
  971.             {   report.floppies = ((struct StringInfo *) IN13_Floppies->SpecialInfo)->LongInt;
  972.                 if (report.floppies < 0)
  973.                 {   report.floppies = 0;
  974.                     GT_SetGadgetAttrs
  975.                     (   IN13_Floppies,
  976.                         MainWindowPtr,
  977.                         NULL,
  978.                         GTIN_Number, report.floppies,
  979.                         TAG_DONE
  980.                     );
  981.                 } elif (report.floppies > 3)
  982.                 {   report.floppies = 3;
  983.                     GT_SetGadgetAttrs
  984.                     (   IN13_Floppies,
  985.                         MainWindowPtr,
  986.                         NULL,
  987.                         GTIN_Number, report.floppies,
  988.                         TAG_DONE
  989.                     );
  990.         }   }   }
  991.         elif (class == IDCMP_GADGETDOWN)
  992.         {   if (addr == MX13_Model)
  993.                 report.model = code;
  994.             elif (addr == MX13_CPU)
  995.                 report.cpu = code;
  996.             elif (addr == MX13_Denise)
  997.                 report.denise = code;
  998.             elif (addr == MX13_Agnus)
  999.             {   report.agnus = code;
  1000.                 if (code == 0)
  1001.                     report.denise = 0;
  1002.                 elif (code == 1 || code == 2)
  1003.                     report.denise = 1;
  1004.                 else
  1005.                 {   /* assert(code == 3 || code == 4); */
  1006.                     report.denise = 2;
  1007.                 }
  1008.                 GT_SetGadgetAttrs
  1009.                 (   MX13_Denise,
  1010.                     MainWindowPtr,
  1011.                     NULL,
  1012.                     GTMX_Active, report.denise,
  1013.                     TAG_DONE
  1014.                 );
  1015. }   }   }   }
  1016.  
  1017. MODULE void refreshpv(void)
  1018. {    UBYTE    i;
  1019.     BPTR    FileHandle;
  1020.  
  1021.     strcpy(string, "C:Version ");
  1022.     strcat
  1023.     (   string,
  1024.             ((struct StringInfo *) ST11_Pathname->SpecialInfo)->Buffer
  1025.     );
  1026.         if (!(FileHandle = (BPTR) Open("T:ReportPlus.temp", MODE_NEWFILE)))
  1027.         rq("Can't open T:ReportPlus.temp for writing!");
  1028.     if (!Execute(string, NULL, FileHandle))
  1029.         rq("Can't execute C:Version!");
  1030.     if (!Close(FileHandle))
  1031.         rq("Can't close T:ReportPlus.temp for writing!");
  1032.  
  1033.         readordie("T:ReportPlus.temp");
  1034.  
  1035.     DeleteFile("T:ReportPlus.temp"); /* returns FALSE for failure */
  1036.     for (i = 0; i <= MEDFIELD; i++)
  1037.             if (IOBuffer[i] == LF)
  1038.             {   IOBuffer[i] = 0;
  1039.                 break;
  1040.             }
  1041.     GT_SetGadgetAttrs
  1042.         (   ST11_Version,
  1043.         MainWindowPtr,
  1044.         NULL,
  1045.         GTST_String, IOBuffer,
  1046.         TAG_DONE
  1047.     );
  1048. }
  1049.  
  1050. AGLOBAL void report_exit(void)
  1051. {   if (SubsystemListPtr)
  1052.     {   FreeNameNodes(SubsystemListPtr);
  1053.         FreeMem(SubsystemListPtr, sizeof(struct List));
  1054.         SubsystemListPtr = NULL;
  1055. }   }
  1056.  
  1057. AGLOBAL void report_init(void)
  1058. {   ULONG i;
  1059.  
  1060.     if (!(SubsystemListPtr = AllocMem(sizeof(struct List), MEMF_CLEAR)))
  1061.         rq("Out of memory!");
  1062.     NewList(SubsystemListPtr);
  1063.     for (i = 0; i <= SUBSYSTEMS; i++)
  1064.         AddNameToTail(SubsystemListPtr, subsystems[i].friendly);
  1065.  
  1066.     newreport(FALSE);
  1067. }
  1068.  
  1069. AGLOBAL void sender(void)
  1070. {   /* PAGE 12 *************************************************************/
  1071.  
  1072.     verynewwindow
  1073.     (   SENDERWIDTH, SENDERHEIGHT,
  1074.         "Report+: Sender Details",
  1075.         BUTTONIDCMP | STRINGIDCMP
  1076.     );
  1077.  
  1078.     if ((!report.loaded) && readin("S:Report.sender"))
  1079.     {   /* # Refer: <last>,<first> (<company> ,phone <phone>)<LF>
  1080.            # Path: <email><LF>
  1081.            # ReferID: <developer><LF> */
  1082.  
  1083.         offset = 0;
  1084.         parse("# Refer: ");
  1085.         parse(",");
  1086.         strcpy(report.lastname,  string);
  1087.         parse(" (");
  1088.         strcpy(report.firstname, string);
  1089.         parse(" ,phone ");
  1090.         strcpy(report.company,   string);
  1091.         parse(")\n# Path: ");
  1092.         strcpy(report.phone,     string);
  1093.         parse("\n# ReferID: ");
  1094.         strcpy(report.email,     string);
  1095.         parse("\n");
  1096.         strcpy(report.developer, string);
  1097.     }
  1098.  
  1099.     /* first name */
  1100.     setgadget(166, 22, 128, 12, "_First name:", NULL);
  1101.     ST12_FirstName = PrevGadPtr = (struct Gadget *) CreateGadget
  1102.     (   STRING_KIND,
  1103.     PrevGadPtr,
  1104.     &Gadget,
  1105.     GTST_String, &(report.firstname),
  1106.     GTST_MaxChars, MEDFIELD,
  1107.     GA_TabCycle, TRUE,
  1108.         GT_Underscore, '_',
  1109.     TAG_DONE
  1110.     );
  1111.  
  1112.     /* last name */
  1113.     setgadget(166, 34, 128, 12, "_Last name:", NULL);
  1114.     ST12_LastName = PrevGadPtr = (struct Gadget *) CreateGadget
  1115.     (   STRING_KIND,
  1116.     PrevGadPtr,
  1117.     &Gadget,
  1118.     GTST_String, &(report.lastname),
  1119.     GTST_MaxChars, MEDFIELD,
  1120.     GA_TabCycle, TRUE,
  1121.         GT_Underscore, '_',
  1122.     TAG_DONE
  1123.     );
  1124.  
  1125.     /* company name */
  1126.     setgadget(166, 46, 128, 12, "_Company:", NULL);
  1127.     ST12_Company = PrevGadPtr = (struct Gadget *) CreateGadget
  1128.     (   STRING_KIND,
  1129.     PrevGadPtr,
  1130.     &Gadget,
  1131.     GTST_String, &(report.company),
  1132.     GTST_MaxChars, MEDFIELD,
  1133.     GA_TabCycle, TRUE,
  1134.         GT_Underscore, '_',
  1135.     TAG_DONE
  1136.     );
  1137.  
  1138.     /* phone */
  1139.     setgadget(166, 58, 128, 12, "_Phone number:", NULL);
  1140.     ST12_Phone = PrevGadPtr = (struct Gadget *) CreateGadget
  1141.     (   STRING_KIND,
  1142.     PrevGadPtr,
  1143.     &Gadget,
  1144.     GTST_String, &(report.phone),
  1145.     GTST_MaxChars, MEDFIELD,
  1146.     GA_TabCycle, TRUE,
  1147.         GT_Underscore, '_',
  1148.     TAG_DONE
  1149.     );
  1150.  
  1151.     /* developer number */
  1152.     setgadget(166, 70, 128, 12, "_Developer number:", NULL);
  1153.     ST12_Developer = PrevGadPtr = (struct Gadget *) CreateGadget
  1154.     (   STRING_KIND,
  1155.     PrevGadPtr,
  1156.     &Gadget,
  1157.         GTST_String, &(report.developer),
  1158.         GTST_MaxChars, LONGFIELD,
  1159.     GA_TabCycle, TRUE,
  1160.         GT_Underscore, '_',
  1161.     TAG_DONE
  1162.     );
  1163.  
  1164.     /* email */
  1165.     setgadget(166, 82, 256, 12, "_EMail:", NULL);
  1166.     ST12_EMail = PrevGadPtr = (struct Gadget *) CreateGadget
  1167.     (    STRING_KIND,
  1168.     PrevGadPtr,
  1169.     &Gadget,
  1170.     GTST_String, &(report.email),
  1171.     GTST_MaxChars, MEDFIELD,
  1172.     GA_TabCycle, TRUE,
  1173.         GT_Underscore, '_',
  1174.     TAG_DONE
  1175.     );
  1176.  
  1177.     /* There are 14 gadgets:
  1178.        BU99_Right
  1179.        BU99_TextEditor
  1180.        ST12_FirstName (2 subgadgets)
  1181.        ST12_LastName (2 subgadgets)
  1182.        ST12_Company (2 subgadgets)
  1183.        ST12_Phone (2 subgadgets)
  1184.        ST12_Developer (2 subgadgets)
  1185.        ST12_EMail (2 subgadgets) */
  1186.     drawgadgets(14);
  1187.  
  1188.     ActivateGadget(ST12_FirstName, MainWindowPtr, NULL);
  1189.     loop();
  1190.  
  1191.     if (!report.loaded)
  1192.     {   /* write out S:Report.sender
  1193.         # Refer: <last>,<first> (<company> ,phone <phone>)<LF>
  1194.         # Path: <email><LF>
  1195.         # ReferID: <developer><LF> */
  1196.  
  1197.         strcpy(report.refer, "# Refer: ");
  1198.         strcat
  1199.         (   report.refer,
  1200.             ((struct StringInfo *) ST12_LastName->SpecialInfo)->Buffer
  1201.         );
  1202.         strcat(report.refer, ",");
  1203.         strcat
  1204.         (   report.refer,
  1205.             ((struct StringInfo *) ST12_FirstName->SpecialInfo)->Buffer
  1206.         );
  1207.         strcat(report.refer, " (");
  1208.         strcat
  1209.         (   report.refer,
  1210.             ((struct StringInfo *) ST12_Company->SpecialInfo)->Buffer
  1211.         );
  1212.         strcat(report.refer, " ,phone ");
  1213.         strcat
  1214.         (   report.refer,
  1215.             ((struct StringInfo *) ST12_Phone->SpecialInfo)->Buffer
  1216.         );
  1217.         strcat(report.refer, ")\n");
  1218.  
  1219.         strcpy(report.path, "# Path: ");
  1220.         strcat
  1221.         (    report.path,
  1222.             ((struct StringInfo *) ST12_EMail->SpecialInfo)->Buffer
  1223.         );
  1224.         strcat(report.path, "\n");
  1225.  
  1226.         strcpy(report.referid, "# ReferID: ");
  1227.         strcat
  1228.         (   report.referid,
  1229.             ((struct StringInfo *) ST12_Developer->SpecialInfo)->Buffer
  1230.         );
  1231.         strcat(report.referid, "\n");
  1232.  
  1233.         strcpy(IOBuffer, report.refer);
  1234.         strcat(IOBuffer, report.path);
  1235.         strcat(IOBuffer, report.referid);
  1236.     
  1237.         writeout("S:Report.sender");
  1238.     }
  1239.     closewindow();
  1240. }
  1241.     
  1242. AGLOBAL void config(void)
  1243. {   /* PAGE 13 ************************************************************** */
  1244.     
  1245.     UBYTE i;
  1246.         
  1247.     verynewwindow
  1248.     (   CONFIGWIDTH, CONFIGHEIGHT,
  1249.         "Report+: Configuration Details",
  1250.         BUTTONIDCMP | STRINGIDCMP | MXIDCMP
  1251.     );
  1252.     
  1253.     if ((!report.loaded) && readin("S:Report.config"))
  1254.     {   /*  # Config: <model>,<cpu>,A=AA|ECS-pal|ECS|old-pal|old,
  1255.             D=AA|ECS|old,RAM=<chip>megC/<fast>megF,TD=<floppies>,
  1256.             HD=<controller>,<cards><LF> */
  1257.  
  1258.         offset = 0;
  1259.         parse("# Config: ");
  1260.     parse(",");
  1261.         report.model = 4;
  1262.     for (i = 0; i <= MODELS; i++)
  1263.     {   if (!stricmp(string, ModelOptions[i]))
  1264.         {   report.model = i;
  1265.                 break; // for speed
  1266.     }   }
  1267.         parse(",A=");
  1268.     report.cpu = 1;
  1269.     for (i = 0; i <= CPUS; i++)
  1270.     {   if (!stricmp(string, CPUOptions[i]))
  1271.         {   report.cpu = i;
  1272.                 break; // for speed
  1273.         }   }
  1274.  
  1275.     parse(",D=");
  1276.     if (!stricmp(string, "AA"))
  1277.         report.agnus = 0;
  1278.     elif (!stricmp(string, "ECS-pal"))
  1279.         report.agnus = 1;
  1280.     elif (!stricmp(string, "ECS"))
  1281.         report.agnus = 2;
  1282.     elif (!stricmp(string, "old-pal"))
  1283.         report.agnus = 3;
  1284.     else /* if (!stricmp(string, "old")) */
  1285.         report.agnus = 4;
  1286.  
  1287.     parse(",RAM=");
  1288.     if (!stricmp(string, "AA"))
  1289.         report.denise = 0;
  1290.     elif (!stricmp(string, "ECS"))
  1291.         report.denise = 1;
  1292.     else /* if (!stricmp(string, "old")) */
  1293.         report.denise = 2;
  1294.  
  1295.     parse("megC/");
  1296.     strcpy(report.chipram, string);
  1297.  
  1298.     parse("megF,TD=");
  1299.     strcpy(report.fastram, string);
  1300.  
  1301.     parse(",HD=");
  1302.     report.floppies = atol(string);
  1303.  
  1304.     parse(",");
  1305.     strcpy(report.hard, string);
  1306.  
  1307.     parse("\n");
  1308.     strcpy(report.expansion, string);
  1309.     }
  1310.  
  1311.     /* These formal coordinates of these text gadgets must not overlap any
  1312.     other gadgets, otherwise any such overlapped gadgets will not be
  1313.     selectable, with the mouse at least. This definitely applies to radio
  1314.     and string gadgets, and most likely other types.
  1315.  
  1316.     model */
  1317.     setgadget(64, 30, 6 * FONTX, 0, "_Model:", PLACETEXT_ABOVE);
  1318.     TE13_ModelText = PrevGadPtr = (struct Gadget *) CreateGadget
  1319.     (   TEXT_KIND,
  1320.         PrevGadPtr,
  1321.         &Gadget,
  1322.         GT_Underscore, '_',
  1323.         TAG_DONE
  1324.     );
  1325.     setgadget(64, 30, 0, 0, NULL, PLACETEXT_RIGHT);
  1326.     MX13_Model = PrevGadPtr = (struct Gadget *) CreateGadget
  1327.     (   MX_KIND,
  1328.         PrevGadPtr,
  1329.         &Gadget,
  1330.         GTMX_Labels, &ModelOptions,
  1331.         GTMX_Active, report.model,
  1332.         TAG_DONE
  1333.     );
  1334.  
  1335.     /* Agnus */
  1336.     setgadget(192, 30, 17 * FONTX, 0, "_Agnus/Alice Type:", PLACETEXT_ABOVE);
  1337.     TE13_AgnusText = PrevGadPtr = (struct Gadget *) CreateGadget
  1338.     (   TEXT_KIND,
  1339.     PrevGadPtr,
  1340.     &Gadget,
  1341.         GT_Underscore, '_',
  1342.         TAG_DONE
  1343.     );
  1344.     setgadget(192, 30, 0, 0, NULL, PLACETEXT_RIGHT);
  1345.     MX13_Agnus = PrevGadPtr = (struct Gadget *) CreateGadget
  1346.     (   MX_KIND,
  1347.     PrevGadPtr,
  1348.     &Gadget,
  1349.     GTMX_Labels, &AgnusOptions,
  1350.     GTMX_Active, report.agnus,
  1351.     TAG_DONE
  1352.     );
  1353.  
  1354.     /* Denise */
  1355.     setgadget(352, 30, 17 * FONTX, 0, "Denise/_Lisa Type:", PLACETEXT_ABOVE);
  1356.     TE13_DeniseText = PrevGadPtr = (struct Gadget *) CreateGadget
  1357.     (   TEXT_KIND,
  1358.     PrevGadPtr,
  1359.     &Gadget,
  1360.         GT_Underscore, '_',
  1361.     TAG_DONE
  1362.     );
  1363.     setgadget(352, 30, 0, 0, NULL, PLACETEXT_RIGHT);
  1364.     MX13_Denise = PrevGadPtr = (struct Gadget *) CreateGadget
  1365.     (   MX_KIND,
  1366.         PrevGadPtr,
  1367.         &Gadget,
  1368.         GTMX_Labels, &DeniseOptions,
  1369.         GTMX_Active, report.denise,
  1370.         TAG_DONE
  1371.     );
  1372.  
  1373.     /* CPU */
  1374.     setgadget(512, 30, 10 * FONTX, 0, "_Processor:", PLACETEXT_ABOVE);
  1375.     // extra spaces ensure consistent centring
  1376.     TE13_CPUText = PrevGadPtr = (struct Gadget *) CreateGadget
  1377.     (   TEXT_KIND,
  1378.         PrevGadPtr,
  1379.         &Gadget,
  1380.         GT_Underscore, '_',
  1381.         TAG_DONE
  1382.     );
  1383.     setgadget(512, 30, 0, 0, NULL, PLACETEXT_RIGHT);
  1384.     MX13_CPU = PrevGadPtr = (struct Gadget *) CreateGadget
  1385.     (   MX_KIND,
  1386.         PrevGadPtr,
  1387.         &Gadget,
  1388.         GTMX_Labels, &CPUOptions,
  1389.         GTMX_Active, report.cpu,
  1390.         TAG_DONE
  1391.     );
  1392.  
  1393.     /* chip RAM */
  1394.     setgadget(465, 110, 1, 12, "Mb", PLACETEXT_RIGHT);
  1395.     TE13_ChipText = PrevGadPtr = (struct Gadget *) CreateGadget
  1396.     (   TEXT_KIND,
  1397.         PrevGadPtr,
  1398.         &Gadget,
  1399.         TAG_DONE
  1400.     );
  1401.     setgadget(400, 110, 64, 12, "_Chip RAM:", NULL);
  1402.     ST13_Chip = PrevGadPtr = (struct Gadget *) CreateGadget
  1403.     (   STRING_KIND,
  1404.         PrevGadPtr,
  1405.         &Gadget,
  1406.         GTST_String, &(report.chipram),
  1407.         GTST_MaxChars, 4,
  1408.         GA_TabCycle, TRUE,
  1409.         GT_Underscore, '_',
  1410.         TAG_DONE
  1411.     );
  1412.  
  1413.     // slow/fast RAM
  1414.     setgadget(465, 122, 1, 12, "Mb", PLACETEXT_RIGHT);
  1415.     TE13_FastText = PrevGadPtr = (struct Gadget *) CreateGadget
  1416.     (   TEXT_KIND,
  1417.         PrevGadPtr,
  1418.         &Gadget,
  1419.         TAG_DONE
  1420.     );
  1421.     setgadget(400, 122, 64, 12, "_Slow/fast RAM:", NULL);
  1422.     ST13_Fast = PrevGadPtr = (struct Gadget *) CreateGadget
  1423.     (   STRING_KIND,
  1424.         PrevGadPtr,
  1425.         &Gadget,
  1426.         GTST_String, &(report.fastram),
  1427.         GTST_MaxChars, 4,
  1428.         GA_TabCycle, TRUE,
  1429.         GT_Underscore, '_',
  1430.         TAG_DONE
  1431.     );
  1432.  
  1433.     /* floppies */
  1434.     setgadget(400, 134, 64, 12, "_Number of floppies:", NULL);
  1435.     IN13_Floppies = PrevGadPtr = (struct Gadget *) CreateGadget
  1436.     (   INTEGER_KIND,
  1437.     PrevGadPtr,
  1438.     &Gadget,
  1439.     GTIN_Number, report.floppies,
  1440.     GA_TabCycle, TRUE,
  1441.         GT_Underscore, '_',
  1442.     TAG_DONE
  1443.     );
  1444.  
  1445.     /* hard disk controller */
  1446.     setgadget(400, 146, 128, 12, "_Hard disk controller:", NULL);
  1447.     ST13_Hard = PrevGadPtr = (struct Gadget *) CreateGadget
  1448.     (    STRING_KIND,
  1449.     PrevGadPtr,
  1450.     &Gadget,
  1451.     GTST_String, &(report.hard),
  1452.     GTST_MaxChars, MEDFIELD,
  1453.     GA_TabCycle, TRUE,
  1454.         GT_Underscore, '_',
  1455.     TAG_DONE
  1456.     );
  1457.  
  1458.     /* expansion cards */
  1459.     setgadget(400, 158, 228, 12, "_Expansion cards:", NULL);
  1460.     ST13_Expansion = PrevGadPtr = (struct Gadget *) CreateGadget
  1461.     (   STRING_KIND,
  1462.         PrevGadPtr,
  1463.         &Gadget,
  1464.     GTST_String, &(report.expansion),
  1465.     GTST_MaxChars, LONGFIELD,
  1466.     GA_TabCycle, TRUE,
  1467.         GT_Underscore, '_',
  1468.     TAG_DONE
  1469.     );
  1470.  
  1471.     /* There are 47 gadgets:
  1472.        BU99_Right      ( 1) = 1
  1473.        TE13_ModelText  ( 1) = 3
  1474.        MX13_Model      (14) =17
  1475.                             =18
  1476.        TE13_AgnusText  ( 1) =19
  1477.        MX13_Agnus      ( 5) =24
  1478.        TE13_DeniseText ( 1) =25
  1479.        MX13_Denise     ( 3) =28
  1480.        TE13_CPUText    ( 1) =29
  1481.        MX13_CPU        ( 7) =36
  1482.        TE13_ChipText   ( 1) =37
  1483.        ST13_Chip       ( 2) =39
  1484.        TE13_FastText   ( 1) =40
  1485.        ST13_Fast       ( 2) =42
  1486.        IN13_Floppies   ( 2) =44
  1487.        ST13_Hard       ( 2) =46
  1488.        ST13_Expansion  ( 2) =48 */
  1489.     drawgadgets(47);
  1490.     ActivateGadget(ST13_Chip, MainWindowPtr, NULL);
  1491.     loop();
  1492.  
  1493.     strcpy(report.chipram,   ((struct StringInfo *) ST13_Chip->SpecialInfo)->Buffer);
  1494.     strcpy(report.fastram,   ((struct StringInfo *) ST13_Fast->SpecialInfo)->Buffer);
  1495.     strcpy(report.hard,      ((struct StringInfo *) ST13_Hard->SpecialInfo)->Buffer);
  1496.     report.floppies        = ((struct StringInfo *) IN13_Floppies->SpecialInfo)->LongInt;
  1497.     if (report.floppies < 0)
  1498.     {   report.floppies = 0;
  1499.     } elif (report.floppies > 3)
  1500.     {   report.floppies = 3;
  1501.     }
  1502.     strcpy(report.expansion, ((struct StringInfo *) ST13_Expansion->SpecialInfo)->Buffer);
  1503.  
  1504.     if (!report.loaded)
  1505.     {   strcpy(report.config, "# Config: ");
  1506.         strcpy(string, ModelOptions[report.model]);
  1507.         strlwr(string);
  1508.         strcat(report.config, string);
  1509.         strcat(report.config, ",");
  1510.         strcpy(string, CPUOptions[report.cpu]);
  1511.         strlwr(string);
  1512.         strcat(report.config, string);
  1513.         strcat(report.config, ",A=");
  1514.         switch(report.agnus)
  1515.         {
  1516.         case 0:
  1517.             strcat(report.config, "AA");
  1518.         break;
  1519.         case 1:
  1520.             strcat(report.config, "ECS-pal");
  1521.         break;
  1522.         case 2:
  1523.             strcat(report.config, "ECS");
  1524.         break;
  1525.         case 3:
  1526.             strcat(report.config, "old-pal");
  1527.         break;
  1528.         default:
  1529.             strcat(report.config, "old");
  1530.         break;
  1531.         }
  1532.         strcat(report.config, ",D=");
  1533.         switch(report.denise)
  1534.         {
  1535.         case 0:
  1536.             strcat(report.config, "AA");
  1537.         break;
  1538.         case 1:
  1539.             strcat(report.config, "ECS");
  1540.         break;
  1541.         default:
  1542.             strcat(report.config, "old");
  1543.         break;
  1544.         }
  1545.         strcat(report.config, ",RAM=");
  1546.         strcat(report.config, report.chipram);
  1547.         strcat(report.config, "megC/");
  1548.         strcat(report.config, report.fastram);
  1549.         strcat(report.config, "megF,TD=");
  1550.         stcl_d(string, report.floppies);
  1551.         strcat(report.config, string);
  1552.         strcat(report.config, ",HD=");
  1553.         strcat(report.config, report.hard);
  1554.         strcat(report.config, ",");
  1555.         strcat(report.config, report.expansion);
  1556.         strcat(report.config, "\n");
  1557.         strcpy(IOBuffer, report.config);
  1558.         writeout("S:Report.config");
  1559.     }
  1560.     closewindow();
  1561. }
  1562.  
  1563. MODULE void updatereportgadgets(void)
  1564. {   // the following command is only needed when New or Open... is the
  1565.     // cause of the update.
  1566.     GT_SetGadgetAttrs
  1567.     (   ST11_Summary,
  1568.         MainWindowPtr,
  1569.         NULL,
  1570.         GTST_String, &(report.summary),
  1571.         TAG_DONE
  1572.     );
  1573.  
  1574.     if (report.type == BUG && report.severity == 3)
  1575.     {   report.severity = 0;
  1576.     }
  1577.  
  1578.     GT_SetGadgetAttrs
  1579.     (   CY11_Type,
  1580.         MainWindowPtr,
  1581.         NULL,
  1582.         GTCY_Active, report.type,
  1583.         TAG_DONE
  1584.     );
  1585.     GT_SetGadgetAttrs
  1586.     (   LV11_Subsystem,
  1587.         MainWindowPtr,
  1588.         NULL,
  1589.         GTLV_Selected, report.subsystem,
  1590.         TAG_DONE
  1591.     );
  1592.     if
  1593.     (   (!strcmp(subsystems[report.subsystem].unfriendly, "wormwars"))
  1594.      || (!strcmp(subsystems[report.subsystem].unfriendly, "report+"))
  1595.     )
  1596.     {   GT_SetGadgetAttrs
  1597.         (   TE11_EMailTo,
  1598.             MainWindowPtr,
  1599.             NULL,
  1600.             GTTX_Text, "amigansoftware@altavista.com",
  1601.             TAG_DONE
  1602.         );
  1603.     } else
  1604.     {   GT_SetGadgetAttrs
  1605.         (   TE11_EMailTo,
  1606.             MainWindowPtr,
  1607.             NULL,
  1608.             GTTX_Text, "support@haage-partner.com",
  1609.             TAG_DONE
  1610.         );
  1611.     }
  1612.  
  1613.     if (report.type == BUG)
  1614.     {   GT_SetGadgetAttrs
  1615.         (   ST11_Pathname,
  1616.             MainWindowPtr,
  1617.             NULL,
  1618.             GTST_String, report.pp,
  1619.             GA_Disabled, FALSE,
  1620.             TAG_DONE
  1621.         );
  1622.         GT_SetGadgetAttrs
  1623.         (   BU11_PathnameASL,
  1624.             MainWindowPtr,
  1625.             NULL,
  1626.             GA_Disabled, FALSE,
  1627.             TAG_DONE
  1628.         );
  1629.         GT_SetGadgetAttrs
  1630.         (   ST11_Version,
  1631.             MainWindowPtr,
  1632.             NULL,
  1633.             GTST_String, report.pv,
  1634.             GA_Disabled, FALSE,
  1635.             TAG_DONE
  1636.         );
  1637.     } else
  1638.     {   GT_SetGadgetAttrs
  1639.         (   ST11_Pathname,
  1640.             MainWindowPtr,
  1641.             NULL,
  1642.             GTST_String, report.pp,
  1643.             GA_Disabled, TRUE,
  1644.             TAG_DONE
  1645.         );
  1646.         GT_SetGadgetAttrs
  1647.         (   BU11_PathnameASL,
  1648.             MainWindowPtr,
  1649.             NULL,
  1650.             GA_Disabled, TRUE,
  1651.             TAG_DONE
  1652.         );
  1653.         GT_SetGadgetAttrs
  1654.         (   ST11_Version,
  1655.             MainWindowPtr,
  1656.             NULL,
  1657.             GTST_String, report.pv,
  1658.             GA_Disabled, TRUE,
  1659.             TAG_DONE
  1660.         );
  1661.     }
  1662.     if (report.type == COM)
  1663.     {   GT_SetGadgetAttrs
  1664.         (   LV11_Subsystem,
  1665.             MainWindowPtr,
  1666.             NULL,
  1667.             GA_Disabled, TRUE,
  1668.             TAG_DONE
  1669.         );
  1670.         GT_SetGadgetAttrs
  1671.         (   ST11_3rdName,
  1672.             MainWindowPtr,
  1673.             NULL,
  1674.             GTST_String, report.thirdname,
  1675.             GA_Disabled, FALSE,
  1676.             TAG_DONE
  1677.         );
  1678.         GT_SetGadgetAttrs
  1679.         (   ST11_3rdVer,
  1680.             MainWindowPtr,
  1681.             NULL,
  1682.             GTST_String, report.thirdver,
  1683.             GA_Disabled, FALSE,
  1684.             TAG_DONE
  1685.         );
  1686.         GT_SetGadgetAttrs
  1687.         (   ST11_3rdManuf,
  1688.             MainWindowPtr,
  1689.             NULL,
  1690.             GTST_String, report.thirdmanuf,
  1691.             GA_Disabled, FALSE,
  1692.             TAG_DONE
  1693.         );
  1694.     } else
  1695.     {   GT_SetGadgetAttrs
  1696.         (   LV11_Subsystem,
  1697.             MainWindowPtr,
  1698.             NULL,
  1699.             GA_Disabled, FALSE,
  1700.             TAG_DONE
  1701.         );
  1702.         GT_SetGadgetAttrs
  1703.         (   ST11_3rdName,
  1704.             MainWindowPtr,
  1705.             NULL,
  1706.             GTST_String, report.thirdname,
  1707.             GA_Disabled, TRUE,
  1708.             TAG_DONE
  1709.         );
  1710.         GT_SetGadgetAttrs
  1711.         (   ST11_3rdVer,
  1712.             MainWindowPtr,
  1713.             NULL,
  1714.             GTST_String, report.thirdver,
  1715.             GA_Disabled, TRUE,
  1716.             TAG_DONE
  1717.         );
  1718.         GT_SetGadgetAttrs
  1719.         (   ST11_3rdManuf,
  1720.             MainWindowPtr,
  1721.             NULL,
  1722.             GTST_String, report.thirdmanuf,
  1723.             GA_Disabled, TRUE,
  1724.             TAG_DONE
  1725.         );
  1726.     }
  1727.     if (report.type == ENH)
  1728.     {   GT_SetGadgetAttrs
  1729.         (   ST11_Debug,
  1730.             MainWindowPtr,
  1731.             NULL,
  1732.             GTST_String, report.debug,
  1733.             GA_Disabled, TRUE,
  1734.             TAG_DONE
  1735.         );
  1736.         GT_SetGadgetAttrs
  1737.         (   CY11_Severity,
  1738.             MainWindowPtr,
  1739.             NULL,
  1740.             GA_Disabled, TRUE,
  1741.             GTCY_Active, report.severity,
  1742.             TAG_DONE
  1743.         );
  1744.         GT_SetGadgetAttrs
  1745.         (   ST11_KS,
  1746.             MainWindowPtr,
  1747.             NULL,
  1748.             GTST_String, report.ks,
  1749.             GA_Disabled, TRUE,
  1750.             TAG_DONE
  1751.         );
  1752.         GT_SetGadgetAttrs
  1753.         (   ST11_WB,
  1754.             MainWindowPtr,
  1755.             NULL,
  1756.             GTST_String, report.wb,
  1757.             GA_Disabled, TRUE,
  1758.             TAG_DONE
  1759.         );
  1760.     } else
  1761.     {   GT_SetGadgetAttrs
  1762.         (   ST11_Debug,
  1763.             MainWindowPtr,
  1764.             NULL,
  1765.             GTST_String, report.debug,
  1766.             GA_Disabled, FALSE,
  1767.             TAG_DONE
  1768.         );
  1769.         GT_SetGadgetAttrs
  1770.         (   CY11_Severity,
  1771.             MainWindowPtr,
  1772.             NULL,
  1773.             GA_Disabled, FALSE,
  1774.             GTCY_Active, report.severity,
  1775.             TAG_DONE
  1776.         );
  1777.         GT_SetGadgetAttrs
  1778.         (   ST11_KS,
  1779.             MainWindowPtr,
  1780.             NULL,
  1781.             GTST_String, report.ks,
  1782.             GA_Disabled, FALSE,
  1783.             TAG_DONE
  1784.         );
  1785.         GT_SetGadgetAttrs
  1786.         (   ST11_WB,
  1787.             MainWindowPtr,
  1788.             NULL,
  1789.             GTST_String, report.wb,
  1790.             GA_Disabled, FALSE,
  1791.             TAG_DONE
  1792.         );
  1793. }   }
  1794.  
  1795. AGLOBAL void newreport(ABOOL display)
  1796. {   ULONG i;
  1797.  
  1798.     report.floppies  = 1;
  1799.     report.agnus     = 0;
  1800.     report.denise    = 0;
  1801.     report.cpu       = 2;
  1802.     report.model     = 4;
  1803.     report.type      = 0;
  1804.     report.severity  = 0;
  1805.     report.subsystem = 0;
  1806.     strcpy(report.chipram,    "2");
  1807.     strcpy(report.fastram,    "6");
  1808.     strcpy(report.hard,       "");
  1809.     strcpy(report.debug,      "");
  1810.     strcpy(report.developer,  "");
  1811.     strcpy(report.expansion,  "");
  1812.     strcpy(report.summary,    "");
  1813.     if (GetVar("Kickstart", report.ks, 6, NULL) == -1)
  1814.         report.ks[0] = 0;
  1815.     if (GetVar("Workbench", report.wb, 6, NULL) == -1)
  1816.         report.wb[0] = 0;
  1817.     strcpy(report.pv,         "");
  1818.     strcpy(report.pp,         "");
  1819.     strcpy(report.thirdname,  "");
  1820.     strcpy(report.thirdver,   "");
  1821.     strcpy(report.thirdmanuf, "");
  1822.     strcpy(report.lastname,   "");
  1823.     strcpy(report.firstname,  "");
  1824.     strcpy(report.company,    "");
  1825.     strcpy(report.phone,      "");
  1826.     strcpy(report.email,      "");
  1827.     strcpy(report.refer,      "");
  1828.     strcpy(report.referid,    "");
  1829.     strcpy(report.path,       "");
  1830.     strcpy(report.config,     "");
  1831.     strcpy(report.output,     "");
  1832.     for (i = 0; i <= 5; i++)
  1833.     {   report.textfield[i][0] = 0;
  1834.     }
  1835.     report.loaded = FALSE;
  1836.  
  1837.     /* Quicker than strcpy(report.foo, ""); is report.foo[0] = 0;
  1838.  
  1839.     Consider linking bug report generator with ID database to
  1840.     automatically generate the list of expansion cards. */
  1841.  
  1842.     if (display)
  1843.     {   updatereportgadgets();
  1844. }   }
  1845.  
  1846. AGLOBAL void openreport(void)
  1847. {   if (asl())
  1848.     {   loadreport();
  1849.         updatereportgadgets();
  1850. }   }
  1851.  
  1852. AGLOBAL void loadreport(void)
  1853. {   ULONG i;
  1854.  
  1855.     /* parse() returns when it has moved along and found the specified
  1856.        `ending string'. The contents, since last parse(), before the
  1857.        `ending string' are returned in string. */
  1858.  
  1859.     if (readin(aslresult))
  1860.     {   strcpy(report.output, aslresult);
  1861.         report.loaded = TRUE;
  1862.  
  1863.         offset = 0;
  1864.         parse("# Subject: ");           // skip '# Subject: '
  1865.         parse("\n# Type: ");            // goto end of '\n# Type: '
  1866.         strcpy(report.summary, string);
  1867.         parse("\n# ");
  1868.         if (!strcmp(string, "bug"))
  1869.         {   report.type = BUG;
  1870.         } elif (!strcmp(string, "compat"))
  1871.         {   report.type = COM;
  1872.         } elif (!strcmp(string, "enhancement"))
  1873.         {   report.type = ENH;
  1874.         }
  1875.         if (report.type != COM)
  1876.         {   parse("Subsystem: ");
  1877.             parse("\n");
  1878.             for (i = 0; i <= SUBSYSTEMS; i++)
  1879.             {   if (!strcmp(string, subsystems[i].unfriendly))
  1880.                 {   report.subsystem = i;
  1881.                     break;
  1882.         }   }   }
  1883.         else
  1884.         {   parse("ProductName: ");
  1885.             parse(" (vers=");
  1886.             strcpy(report.thirdname,  string);
  1887.             parse(")\n# ProductInfo: :");
  1888.             strcpy(report.thirdver,   string);
  1889.             parse(":\n");
  1890.             strcpy(report.thirdmanuf, string);
  1891.         }
  1892.         parse("# Severity: ");
  1893.         parse("\n# ");
  1894.         if (!strcmp(string, "a"))
  1895.         {   report.severity = 0;
  1896.         } elif (!strcmp(string, "b"))
  1897.         {   report.severity = 1;
  1898.         } elif (!strcmp(string, "c"))
  1899.         {   report.severity = 2;
  1900.         } elif (!strcmp(string, "ok"))
  1901.         {   report.severity = 3;
  1902.         } elif (!strcmp(string, "e"))
  1903.         {   report.type     = ENH;
  1904.         }
  1905.  
  1906.         if (report.type != ENH)
  1907.         {   parse("Release: KS=");
  1908.             parse(",WB=");
  1909.             strcpy(report.ks, string);
  1910.             if (report.type == BUG)
  1911.             {   parse(",Program=");
  1912.                 strcpy(report.wb, string);
  1913.                 parse("\n");
  1914.                 strcpy(report.pv, string);
  1915.             } else
  1916.             {   // assert(report.type == COM);
  1917.                 parse("\n");
  1918.                 strcpy(report.wb, string);
  1919.                 report.pv[0] = 0;
  1920.             }
  1921.         } else report.pv[0] = 0;
  1922.         parse("# Date: ");
  1923.  
  1924.         // now sender fields
  1925.         parse("# Refer: ");
  1926.         parse(",");
  1927.         strcpy(report.lastname, string);
  1928.         parse(" (");
  1929.         strcpy(report.firstname, string);
  1930.         parse(" ,phone ");
  1931.         strcpy(report.company, string);
  1932.         parse(")\n# Path: ");
  1933.         strcpy(report.phone, string);
  1934.         parse("\n# ReferID: ");
  1935.         strcpy(report.email, string);
  1936.         parse("\n");
  1937.         strcpy(report.developer, string);
  1938.  
  1939.         // now config fields
  1940.         parse("# Config: ");
  1941.     parse(",");
  1942.     report.model = 4;
  1943.     for (i = 0; i <= MODELS; i++)
  1944.     {   if (!stricmp(string, ModelOptions[i]))
  1945.         {   report.model = i;
  1946.                 break; // for speed
  1947.     }   }
  1948.         parse(",A=");
  1949.     report.cpu = 1;
  1950.     for (i = 0; i <= CPUS; i++)
  1951.     {   if (!stricmp(string, CPUOptions[i]))
  1952.         {   report.cpu = i;
  1953.                 break; // for speed
  1954.         }   }
  1955.  
  1956.     parse(",D=");
  1957.     if (!stricmp(string, "AA"))
  1958.         report.agnus = 0;
  1959.     elif (!stricmp(string, "ECS-pal"))
  1960.         report.agnus = 1;
  1961.     elif (!stricmp(string, "ECS"))
  1962.         report.agnus = 2;
  1963.     elif (!stricmp(string, "old-pal"))
  1964.         report.agnus = 3;
  1965.     else /* if (!stricmp(string, "old")) */
  1966.         report.agnus = 4;
  1967.  
  1968.     parse(",RAM=");
  1969.     if (!stricmp(string, "AA"))
  1970.         report.denise = 0;
  1971.     elif (!stricmp(string, "ECS"))
  1972.         report.denise = 1;
  1973.     else /* if (!stricmp(string, "old")) */
  1974.         report.denise = 2;
  1975.  
  1976.     parse("megC/");
  1977.     strcpy(report.chipram, string);
  1978.  
  1979.     parse("megF,TD=");
  1980.     strcpy(report.fastram, string);
  1981.  
  1982.     parse(",HD=");
  1983.     report.floppies = atol(string);
  1984.  
  1985.     parse(",");
  1986.     strcpy(report.hard, string);
  1987.  
  1988.     parse("\n");
  1989.         strcpy(report.expansion, string);
  1990.  
  1991.         report.pp[0] = 0;
  1992.  
  1993.         if (report.type == BUG)
  1994.         {   parse("### BRIEF BUG DESCRIPTION:\n");
  1995.             parse("\n### BUG GENERATION PROCEDURE OR EXAMPLE:\n");
  1996.             strcpy(report.textfield[0], string);     // bug description
  1997.             parse("\n### ALSO RUNNING:\n");
  1998.             strcpy(report.textfield[1], string);     // bug procedure
  1999.             parse("\n### IF THIS WORKS DIFFERENTLY ON OTHER VERSIONS "
  2000.                   "OR HARDWARE, EXPLAIN:\n");
  2001.             strcpy(report.debug, string);            // also running
  2002.             parse("\n### RELATED PROBLEMS:\n");
  2003.             strcpy(report.textfield[2], string);     // explain differently
  2004.             parsetoend();
  2005.             strcpy(report.textfield[3], string);     // related problems
  2006.         } elif (report.type == COM)
  2007.         {   if (report.severity != 3)
  2008.             {   parse("### BRIEF BUG DESCRIPTION:\n");
  2009.                 parse("\n### BUG GENERATION PROCEDURE OR EXAMPLE:\n");
  2010.                 strcpy(report.textfield[0], string); // bug description
  2011.                 parse("\n### ALSO RUNNING:\n");
  2012.                 strcpy(report.textfield[1], string); // bug procedure
  2013.                 parse("\n### IF THIS WORKS DIFFERENTLY ON OTHER VERSIONS "
  2014.                       "OR HARDWARE, EXPLAIN:\n");
  2015.                 strcpy(report.debug, string);        // also running
  2016.                 parse("\n### WHAT DEVELOPER IS DOING IN THAT AREA OF SW "
  2017.                       "OR HW:\n");
  2018.                 strcpy(report.textfield[2], string); // explain differently
  2019.                 parse("\n### RELATED PROBLEMS:\n");
  2020.                 strcpy(report.textfield[3], string); // what doing?
  2021.                 parsetoend();
  2022.                 strcpy(report.textfield[4], string); // related problems
  2023.             } else
  2024.             {   parse("### BRIEF BUG DESCRIPTION:\n");
  2025.                 parse("\n### BUG GENERATION PROCEDURE OR EXAMPLE:\n");
  2026.                 strcpy(report.textfield[0], string); // bug description
  2027.                 parse("\n### WHAT DEVELOPER IS DOING IN THAT AREA OF SW "
  2028.                       "OR HW:\n");
  2029.                 strcpy(report.textfield[1], string); // explain differently
  2030.                 parse("\n### RELATED PROBLEMS:\n");
  2031.                 strcpy(report.textfield[2], string); // what doing?
  2032.                 parsetoend();
  2033.                 strcpy(report.textfield[3], string); // related problems
  2034.         }   }
  2035.         else
  2036.         {   // assert(report.type == ENH);
  2037.             parse("### ENHANCEMENT REQUEST:\n");
  2038.             parsetoend();
  2039.             strcpy(report.textfield[0], string);
  2040.         }
  2041.         updatereportgadgets();
  2042. }   }
  2043.  
  2044. /*          # Subject: <subject><LF>
  2045.             # Type: bug|compat|enhancement<LF>
  2046. BUG,ENH     # Subsystem: <subsystem><LF>
  2047. COM         # ProductName: <name> (vers=<version>)
  2048. COM         # ProductInfo: :<manufacturer>:
  2049.             # Severity: a|b|c|ok|e
  2050. BUG         # Release: KS=<version>,WB=<version>,Program=<version>
  2051. COM         # Release: KS=<version>,WB=<version>
  2052.             # Date: <weekday> dd-Mon-yy hh:mm:ss
  2053.             # Refer: <refer>
  2054.             # Path: <path>
  2055.             # ReferID: <referid>
  2056.             # Config: <config>
  2057. BUG,COMa-c  ### BRIEF BUG DESCRIPTION:
  2058. BUG,COMa-c  ### BUG GENERATION PROCEDURE OR EXAMPLE:
  2059. BUG,COM     ### ALSO RUNNING:
  2060.             <debug>
  2061. BUG,COM     ### IF THIS WORKS DIFFERENTLY ON OTHER VERSIONS OR HARDWARE,
  2062.             EXPLAIN:
  2063. COMa-c        ### WHAT DEVELOPER IS DOING IN THAT AREA OF SW OR HW:    
  2064. BUG,COMa-c  ### RELATED PROBLEMS:
  2065. ENH         ### ENHANCEMENT REQUEST: */
  2066.  
  2067.